import config
import obj_config
import time

# from obj_config import dict_class
# kernel_func = dict_class


class Api:
    def queue_voice_str_api(self):
        """
        Описание:

        Функция для чтения очереди Queue потока распознования речи.
        Также в функции присуствует логирование.
        Функция ожидает пока речь не будет распознана.

        Возращает:

        **Строку распознаной речи**

        """

        if len(config.buff_list_mess_speech["mess"]) >= config.buff_mess_speech_count:
            config.buff_mess_speech = {"mess": [], "data": []}
        voice_str = config.stream_speech.get()
        config.speech_recognition_str_api = voice_str
        config.buff_list_mess_speech["mess"].append(voice_str)
        config.buff_list_mess_speech["data"].append(time.time())
        return voice_str

    def queue_voice_time_str_api(self, say_expectatio=5):
        """
        Описание:

        Функция для чтения очереди Queue потока распознования речи,
        в цикле течение **say_expectatio** заданной в конфигурации.
        Также в функции присуствует логирование.

        Параметры функции:

        `say_expectatio`: Параметра ожидания фразы в секундах

        Возращает:

        **Строку распознаной речи или пустую строку**

        """
        if len(config.buff_list_mess_speech["mess"]) >= config.buff_mess_speech_count:
            config.buff_mess_speech = {"mess": [], "data": []}
        start_time = time.time()
        # config.queue_message_external_events.empty() == False
        cheek_message = False
        while not cheek_message:
            cheek_message = config.stream_speech.empty()
            if cheek_message:
                # config.queue_message_external_events.get()
                voice_str = config.stream_speech.get()
                config.speech_recognition_str_api = voice_str
                config.buff_list_mess_speech["mess"].append(voice_str)
                config.buff_list_mess_speech["data"].append(time.time())
                return voice_str

            else:
                if (time.time() - start_time) >= say_expectatio:
                    cheek_message = True
                    # break
                    return ""

    def queue_voice_event_time_str_api(self, say_expectatio=5):
        """
        Описание:

        Функция для чтения очереди Queue потока распознования речи,
        в цикле течение **say_expectatio** заданной в конфигурации и
        проверкой буфера потока и собития сообщений.
        Также в функции присуствует логирование.

        Параметры функции:

        `say_expectatio`: Параметра ожидания фразы в секундах

        Возращает:

        **Строку распознаной речи или пустую строку**

        """

        if len(config.buff_list_mess_speech["mess"]) >= config.buff_mess_speech_count:
            config.buff_mess_speech = {"mess": [], "data": []}
        cheek_message = False
        start_time = time.time()
        while not cheek_message:
            cheek_message = config.stream_speech.empty()
            if cheek_message:
                voice_str = config.stream_speech.get()
                config.speech_recognition_str_api = voice_str
                config.buff_list_mess_speech["mess"].append(voice_str)
                config.buff_list_mess_speech["data"].append(time.time())
                return voice_str
            else:
                if (time.time() - start_time) >= say_expectatio:
                    cheek_message = True
                else:
                    obj_config.obj_work_mode.wrapper_timer(
                        config.work_mode, obj_config.obj_work_mode.cheek_timer_name
                    )
                    obj_config.communication_obj.event_message()
                    if (time.time() - start_time) >= say_expectatio:
                        cheek_message = True
        return ""

    def cmd_str_api(self, cmd):
        config.cmd_str_api = cmd

    def message_api(self):
        return config.comuniction_str_api

    def menu_list_api(self):
        return config.default_modul

    def tags_api(self, tags):
        if isinstance(tags, list):
            config.tags_list_api = tags
        elif isinstance(tags, dict):
            config.tags_dict_api = tags
        elif isinstance(tags, str):
            config.cmd_str_api = tags
        elif isinstance(tags, int):
            config.tags_int_api = tags
        else:
            pass
